package myList1;

/*2.1 表*/
public class MyArrayList<T>    //表泛型类
{
    final int initcapacity = 10;    //表的初始容量(常量)
    public T[] data;        //存放表中元素
    public int size;        //存放表的长度
    private int capacity;        //存放表的容量

    public MyArrayList()    //构造方法，实现data和length的初始化
    {
        data = (T[]) new Object[initcapacity];  //强制转换为E类型数组
        capacity = initcapacity;
        size = 0;

    }

    //表的基本运算算法
    private void updateCapacity(int newCapacity)
    //改变表的容量为newcapacity
    {
        T[] newdata = (T[]) new Object[newCapacity];
        for (int i = 0; i < size; i++)        //复制原来的元素
            newdata[i] = data[i];
        capacity = newCapacity;        //设置新容量
        data = newdata;            //仍由data标识数组
    }


    public void createList(T[] a)            //由a整体建立表
    {
        size = 0;
        for (int i = 0; i < a.length; i++) {
            if (size == capacity)                    //出现上溢出时
                updateCapacity(2 * size);        //扩大容量
            data[size] = a[i];
            size++;                                    //添加的元素个数增加1
        }
    }

    public void add(T e)        //在表的末尾添加一个元素e
    {
        if (size == capacity)    //表空间满时倍增容量
            updateCapacity(2 * size);
        data[size] = e;
        size++;            //长度增1
    }

    public void insert(int i, T e)    //在表中序号i位置插入元素e
    {
        if (i < 0 || i > size)            //参数错误抛出异常
            throw new IllegalArgumentException("插入:位置i不在有效范围内");
        if (size == capacity)        //满时倍增容量
            updateCapacity(2 * size);
        for (int j = size; j > i; j--)        //data[i]及后面元素后移一个位置
            data[j] = data[j - 1];
        data[i] = e;                //插入元素e
        size++;                //表长度增1
    }

    public T getElem(int i)    //返回表中序号为i的元素
    {
        if (i < 0 || i > size - 1)
            throw new IllegalArgumentException("查找:位置i不在有效范围内");
        return (T) data[i];
    }

    public void setElem(int i, T e)    //设置序号i的元素为e
    {
        if (i < 0 || i > size - 1)
            throw new IllegalArgumentException("设置:位置i不在有效范围内");
        data[i] = e;
    }


    public void delete(int i)         //在表中删除序号i位置的元素
    {
        if (i < 0 || i > size - 1)           //参数错误抛出异常
            throw new IllegalArgumentException("删除:位置i不在有效范围内");
        for (int j = i; j < size - 1; j++)    //将data[i]之后的元素前移一个位置
            data[j] = data[j + 1];
        size--;                 //顺序表长度减1
        if (capacity > initcapacity && size == capacity / 4)
            updateCapacity(capacity / 2); //满足要求容量减半
    }

    public int size()        //求表长度
    {
        return size;
    }

    public void setSize(int nLen)    //设置表的长度
    {
        if (nLen < 0 || nLen > size)
            throw new IllegalArgumentException("设置长度:n不在有效范围内");
        size = nLen;
    }

    public int getNo(T e)    //查找第一个为e的元素的序号
    {
        int i = 0;
        while (i < size && !data[i].equals(e))
            i++;            //查找元素e
        if (i >= size)        //未找到时返回-1
            return -1;
        else
            return i;        //找到后返回其序号
    }

    public void swap(int i, int j)        //交换data[i]和data[j]
    {
        T tmp = data[i];
        data[i] = data[j];
        data[j] = tmp;
    }

    public String toString()    //将线性表转换为字符串
    {
        String ans = "";
        for (int i = 0; i < size; i++)
            ans += data[i].toString() + " ";
        return ans;
    }


}
